use rand::Rng;
use std::cmp::Ordering;
use std::io;
use std::{thread, time};


//////////////////////////////////////////
//         struct
//////////////////////////////////////////
// 增加属性来派生 Debug trait
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}


pub fn structure_conf() {
    println!("#################################");
    println!("#################################");
    println!("structure_conf.");

    // 编写一个计算长方形面积的程序
    areaComp();

}

/*
编写一个计算长方形面积的程序:
获取以像素为单位的长方形的宽度和高度，并计算出长方形的面积。
 */
fn areaComp(){
    // 普通变量入参
    let width = 30;
    let height = 50;
    println!(
        "The area of the rectangle is {} square pixels, width:{}, height:{}.",
        areaU32(width, height), width, height
    );

    // 元组作为入参
    let rect = (width, height);
    println!(
        "The area of the rectangle is {} square pixels, width:{}, height:{}.",
        area(rect), rect.0, rect.1
    );

    // 使用结构体重构：赋予更多意义
    let scale = 2;
    let rectangle = Rectangle {
        width: dbg!(width * scale),
        height: height,
    };
    // {:?} 和 {:#?} 为两种不同的输出风格
    println!("rectangle is {:?}", rectangle);
    println!("rectangle is {:#?}", rectangle);
    dbg!(&rectangle);
    println!(
        "The area of the rectangle is {} square pixels.",
        areaStruct(&rectangle)
    );
}

fn areaU32(width: u32, height: u32) -> u32 {
    width * height
}

// 使用元组作为入参
fn area(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}

// 使用结构体作为入参
// 参数名 rectangle， 类型是一个结构体 Rectangle 实例的不可变借用
// 不是获取它的所有权，这样 main 函数就可以保持 rectangle 的所有权并继续使用它，所以这就是为什么在函数签名和调用的地方会有 &。
fn areaStruct(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}

